ADC 即數位類比轉換器,將一連串連續的類比訊號(或物理量)轉換為數位訊號
概念類似於將單位時間內瞬間的每一點電壓轉換為數位訊號
自然界的訊號皆為類比電壓,時間大小是連續的
而ADC則是將類比形式的連續訊號轉換為數位形式的離散訊號的一種設備
當嵌入式開發當中需要讀取周遭環境例如溫溼度、壓力等,就需要ADC將類比訊號轉換為數位訊號
即類比電壓轉換成數位後,轉換為多準確的數位值,解析度越高,訊號越精準
因為訊號以二進制方式儲存,通常以位元(bit)為單位
以12bit的解析度為例,總共有2^12=4096階,實際表示方式可能為0~4095
假設電壓上限為 0~5V,則數位訊號需要上升一個單位需要(5V-0V)/ (2^12-1)=0.0012V
假設讀取的值為1000,實際電壓即1000*0.0012=1.2V
Joystick的原理就是透過改變(X,Y)兩軸電阻的分壓值
我們就可以透過ADC將類比訊號轉換為數位訊號
幾乎就可以當作搖桿使用 (他本來就是搖桿啊!XD)
Joystick-Module接腳
Vcc : 正電源
GND : 接地
VRX : X軸分量
VRY : Y軸分量
SW : 按鈕
今天的目標是控制搖桿使用ADC讀取這些引腳,當搖桿在向上位置時,上方LED燈就亮,反之不亮,其餘向下、左、右以此類推,當搖桿按鈕被按下,點亮中間的LED。來看看下面CubeMX的設定
跟往常一樣設定RCC -> HSE、LSE為Crystal/Ceramic Resonator
SYS -> Debug Serial Wire 打勾
將ADC -> IN0、IN1作為搖桿X-Y軸的輸入引腳
預設PIN腳會是PA0、PA1
同時我們需要PA2設定GPIO_Input做按鈕偵測
PA3~PA7設定GPIO_Output供應點亮LED
分別是上、下、左、右、中心。
頻率直接給他最大下去了啦
開啟DMA,DMA不須透過CPU讓ADC自動讀取值放在指定的記憶體位置,使用者只須到指定的記憶體提取資料即可
1.DMA Settings
2.ADD
3.Choose ADC
4.Data Width -> Word(32bit)
5.apply and ok
---生成檔案---
uint32_t joy[]={0,0};
為了儲存12 bit的ADC值(搖桿的X-Y分量),我宣告了一個包兩個變數的陣列
HAL_ADC_Start_DMA(&hadc, joy, 2);
我們要讀取ADC1的多個通道,我們必須使用DMA來做到這一點
在上面的code中,DMA 將讀取 ADC1 的 2 個通道,並將資料儲存到我們指定的joy陣列,且有兩筆資料
if (joy[1]>=4000) //up
HAL_GPIO_WritePin( GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
else
HAL_GPIO_WritePin( GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
if (joy[1]<=800) //down
HAL_GPIO_WritePin( GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
else
HAL_GPIO_WritePin( GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
if (joy[0]>=4000) //right
HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
else
HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
if (joy[0]<=800) //left
HAL_GPIO_WritePin( GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
else
HAL_GPIO_WritePin( GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
if (HAL_GPIO_ReadPin( GPIOA, GPIO_PIN_2)) //center
HAL_GPIO_WritePin( GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
else
HAL_GPIO_WritePin( GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
}
- STM32 Nucleo-64 boards (MB1136)資料手冊
https://www.st.com/resource/en/user_manual/dm00105823-stm32-nucleo-64-boards-mb1136-stmicroelectronics.pdf- STM32L053R8 datasheet
https://www.st.com/resource/en/datasheet/stm32l053r8.pdf- RM0367 Reference manual Ultra-low-power STM32L0x3 advanced Arm®-based 32-bit MCUs
https://www.st.com/resource/en/reference_manual/dm00095744-ultra-low-power-stm32l0x3-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf- ARM Mbed官網介紹 - NUCLEO-L053R8
https://os.mbed.com/platforms/ST-Nucleo-L053R8/- STM32 官網介紹 - STM32L053R8
https://www.st.com/en/microcontrollers-microprocessors/stm32l053r8.html#overview
- 此開發板售價在臺幣1000元以下,讀者可於以下網站購得:
https://www.mouser.tw/
https://www.digikey.tw/
已經快不行了